From acde5807bb3e4c9f5df793ccfb46a3209e9ecbb0 Mon Sep 17 00:00:00 2001 From: Joan Torres Lopez Date: Tue, 5 May 2026 17:28:18 +0200 Subject: [PATCH] authPrompt: Await wiggle via show-message promise resolver Pass promise resolver through the show-message signal so the message queue waits for the wiggle animation to finish before scheduling the next message timeout. This replaces the previous approach of manually increasing the timeout duration to account for the wiggle. Part-of: --- js/gdm/authPrompt.js | 21 +++++++++------------ js/gdm/util.js | 27 +++++++++++++++++---------- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js index e186f8ca1..c01c6fe2e 100644 --- a/js/gdm/authPrompt.js +++ b/js/gdm/authPrompt.js @@ -478,21 +478,18 @@ export const AuthPrompt = GObject.registerClass({ this.reset(); } - _onShowMessage(_userVerifier, serviceName, message, type) { + _onShowMessage(_userVerifier, serviceName, message, type, showMessageResolver) { this.setMessage(message, type); this.emit('prompted'); - if (type === GdmUtil.MessageType.ERROR && - this._userVerifier.serviceIsFingerprint(serviceName)) { - // TODO: Use Await for wiggle to be over before unfreezing the user verifier queue - const wiggleParameters = { - duration: 65, - wiggleCount: 3, - }; - this._userVerifier.increaseCurrentMessageTimeout( - wiggleParameters.duration * (wiggleParameters.wiggleCount + 2)); - wiggle(this._message, wiggleParameters); - } + const shouldWiggle = type === GdmUtil.MessageType.ERROR && + this._userVerifier.serviceIsFingerprint(serviceName); + + const wigglePromise = shouldWiggle + ? wiggle(this._message, {duration: 65, wiggleCount: 3}) + : Promise.resolve(); + + showMessageResolver?.(wigglePromise); } _onVerificationFailed(userVerifier, serviceName, canRetry) { diff --git a/js/gdm/util.js b/js/gdm/util.js index d7339c140..eebbc8e24 100644 --- a/js/gdm/util.js +++ b/js/gdm/util.js @@ -262,11 +262,6 @@ export class ShellUserVerifier extends Signals.EventEmitter { this.emit('no-more-messages'); } - increaseCurrentMessageTimeout(interval) { - if (!this._messageQueueTimeoutId && interval > 0) - this._currentMessageExtraInterval = interval; - } - _serviceHasPendingMessages(serviceName) { return this._messageQueue.some(m => m.serviceName === serviceName); } @@ -279,17 +274,23 @@ export class ShellUserVerifier extends Signals.EventEmitter { this._queuePriorityMessage(serviceName, null, messageType); } - _queueMessageTimeout() { - if (this._messageQueueTimeoutId !== 0) + async _queueMessageTimeout() { + if (this._messageQueueTimeoutId !== 0 || this._showMessageResolver) return; const message = this.currentMessage; + const {promise, resolve} = Promise.withResolvers(); + this._showMessageResolver = resolve; - delete this._currentMessageExtraInterval; - this.emit('show-message', message.serviceName, message.text, message.type); + this.emit('show-message', message.serviceName, message.text, message.type, this._showMessageResolver); + + await promise.catch(logError); + if (!this._showMessageResolver) + return; + this._showMessageResolver = null; this._messageQueueTimeoutId = GLib.timeout_add_once(GLib.PRIORITY_DEFAULT, - message.interval + (this._currentMessageExtraInterval | 0), () => { + message.interval, () => { this._messageQueueTimeoutId = 0; if (this._messageQueue.length > 1) { @@ -330,6 +331,12 @@ export class ShellUserVerifier extends Signals.EventEmitter { GLib.source_remove(this._messageQueueTimeoutId); this._messageQueueTimeoutId = 0; } + + if (this._showMessageResolver) { + this._showMessageResolver(); + this._showMessageResolver = null; + } + this.emit('show-message', null, null, MessageType.NONE); } -- 2.39.5